package Text.sxt;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

// 学生类
  class Student {
    String studentId;
    String name;
    List<Course> courses;  // 新增：用于存储课程信息

    Student(String name, String studentId) {  // 构造函数修改，只接收姓名和学号
        this.studentId = studentId; //初始化学生id
        this.name = name;  //初始化学生姓名
        this.courses = new ArrayList<>();  // 初始化课程列表
    }

    // 添加课程的方法
    //该方法允许你为Student对象添加一门新的课程。当你调用这个方法时，你需要提供课程的ID、名称、总学分和学生在该课程的分数。
    //方法内部，它创建了一个新的Course对象，并将其添加到学生的courses列表中。这个列表存储了学生所有课程的信息。

    public void addCourse(String courseId, String courseName, double totalCredit, double score) { //不接受任何返回值（void） //在学生对象的courses列表中添加一个新的Course对象。
        courses.add(new Course(courseId, courseName, totalCredit, score)); //创建一个新的Course对象，使用提供的参数初始化。
                                                                           
    }

    // 将百分制成绩转换为等级制成绩
    String convertToLetterGrade(double score) {
        if (90 <= score && score <= 100) {
            return "A";
        } else if (86 <= score && score < 90) {
            return "A-";
        } else if (83 <= score && score < 86) {
            return "B+";
        } else if (80 <= score && score < 83) {
            return "B";
        } else if (76 <= score && score < 80) {
            return "B-";
        } else if (73 <= score && score < 76) {
            return "C+";
        } else if (70 <= score && score < 73) {
            return "C";
        } else if (66 <= score && score < 70) {
            return "C-";
        } else if (63 <= score && score < 66) {
            return "D+";
        } else if (60 <= score && score < 63) {
            return "D";
        } else {
            return "F";
        }
    }

    // 将等级制成绩转换为绩点
    double getGradePoint(String letterGrade) {
        switch (letterGrade) { //使用switch语句来根据输入的等级制成绩返回对应的绩点值。
            case "A":
                return 4.0;
            case "A-":
                return 3.67;
            case "B+":
                return 3.33;
            case "B":
                return 3.00;
            case "B-":
                return 2.67;
            case "C+":
                return 2.33;
            case "C":
                return 2.00;
            case "C-":
                return 1.67;
            case "D+":
                return 1.33;
            case "D":
                return 1.00;
            default:
                return 0.00;
        }
    }

    public String getStudentId() {
        return studentId;
    }

    public String getName() {
        return name;
    }

    // 计算单个学生的 GPA
    public double calculateGPA() {
        double totalGradePointCredit = 0; //用于累加每门课程的绩点乘以相应的学分。
        double totalCredit = 0; //：用于累加所有课程的总学分。
        for (Course course : courses) { //使用for循环遍历学生对象中courses列表的每一门课程。
            String letterGrade = convertToLetterGrade(course.getScore()); //对于每门课程，使用convertToLetterGrade方法将课程的分数（course.getScore()）转换为等级制成绩（letterGrade）。
            double gradePoint = getGradePoint(letterGrade); //使用getGradePoint方法将等级制成绩（letterGrade）转换为对应的绩点（gradePoint）
            totalGradePointCredit += gradePoint * course.getTotalCredit(); //将当前课程的绩点（gradePoint）乘以该课程的总学分（course.getTotalCredit()），然后将结果累加到totalGradePointCredit。
            totalCredit += course.getTotalCredit(); //将当前课程的总学分累加到totalCredit。
        }
        return totalCredit > 0? totalGradePointCredit / totalCredit : 0; //如果totalCredit大于0（即学生至少修了一门课程），则将totalGradePointCredit除以totalCredit得到GPA。
                                                                         //如果totalCredit为0（即学生没有修任何课程），则GPA为0。
                                                                         //返回计算得到的GPA值。
    }
}

